--[[
功能说明: 限制用户每X秒, 最多请求Y次
原理: 查询当前时间前X秒,到现在一共请求多少次,是否超过最大限制
]]

local redisKey = KEYS[1] -- 要进行限流的Key
local rate = tonumber(ARGV[1]) --每X秒
local limit = tonumber(ARGV[2]) -- 最多执行Y个请求
local now = tonumber(ARGV[3]) --当前请求时间戳
local before = now - rate * 1000 --当前请求时间戳
local memberKey = redisKey .. "-member" -- 自增数作为member防止zSet去重
local expire_seconds = 60 * 1  -- key存活时间,1分钟
local result = 1  -- 返回结果 1:成功, 0:失败

-- 查询redis,前X秒至当前已请求次数
local current = tonumber(redis.call('ZCOUNT', redisKey, before, now) or 0)


if current + 1 <= limit then
    local zSetMember = redis.call('INCR', memberKey)
    redis.call('zadd', redisKey, now, zSetMember) -- 自增数作为member防止zSet去重
else
    result = 0 -- 超出请求限制
end

-- 移除过期数据, 刷新redisKey存活时间
redis.call('ZREMRANGEBYSCORE', redisKey, '-inf', before)
redis.call("expire", redisKey, expire_seconds)
redis.call("expire", memberKey, expire_seconds)
return result
